home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_1 / phyconst < prev    next >
Text File  |  1995-03-31  |  17KB  |  518 lines

  1. Article 1967 of comp.sys.handhelds:
  2. Date:    Fri, 15 Jun 90 17:04:18 EDT
  3. >From:    Michael Woodhams <michael@astro.princeton.edu>
  4. Subject: HP48sx
  5.  
  6. Secondly, I have found the following programs useful. This is my first
  7. major programing project on the HP48sx, and I have since thought of
  8. several ways of improving the program (primarily using the port 0
  9. memory and saving the screen and heirarchical list in variables, and
  10. secondly spliting the program into several subprograms.) However, I am
  11. leaving to go on holiday tomorrow for a month, and I do not have time
  12. to make the changes before I go.
  13.  
  14. If it is too difficult for you to repost these for some reason, send
  15. me mail, and I will do it myself after my holiday.
  16.  
  17. Michael Woodhams.
  18.  
  19. michael@astro.princeton.edu
  20.  
  21.  
  22. Below are listings of two programs for the HP-48SX. The second one
  23. acts as a full-screen menu of physical constants and units. Running
  24. the program turns the top 5 rows of the keyboard into menu keys, and
  25. displays the menu items in the top part of the screen, leaving the
  26. level 1 stack entry vissable. After a key press, this menu display
  27. disappears, and if the key was from the top 5 rows, the appropriate
  28. constant is put on the stack or a unit is applied in the normal
  29. manner. (unshifted - multiply by the unit, right shift - divide by the
  30. unit, left shift - convert level 1 entry to this unit.) I assign this
  31. program to the 'CST' key and leave my calculator in user mode, but it
  32. could be used in other ways. (Warning - whatever is on the graphics
  33. screen is overwritten.)
  34.  
  35. I am an astrophysics student, and this is reflected in the choice of
  36. units and constants in my menu. Other people will have different
  37. preferences, so the first program is one that will create a program
  38. like the second one, with your own choice of menu items. It first
  39. prompts for labels for the menu display, and then for the commands to
  40. be executed by each key. There is no error checking in creating the
  41. display, so make sure your labels are short enough to fit in an
  42. ordinary menu box. (Except for the enter key, which has a larger box.)
  43. If you avoid wide characters like "M" and "W", this should be 5
  44. characters per label. The command for each key is assumed to be either
  45. a unit or a constant. For units, enter the standard abbreviation. For
  46. constants, enter the constant. I think the program would work if you
  47. entered a command instead of a constant, but I haven't tried it.
  48. Finally, note that the program refers to the "+/-" key (to the right
  49. of the enter key) as "5,3" because it seems more intuitive to me, and
  50. because it simplifies the program logic. The calculator, however,
  51. thinks this is key 5,2 because it is the second key in the 5th row.
  52.  
  53. I have not make allowance for shifted keys except for units. For just
  54. a few keys, this could be done by editing the menu program and
  55. inserting the desired commands in the hierarchical list. If you press
  56. a shifted key for an ordinary command, or an alpha key for a unit
  57. command, the program will crash with several new items on the stack.
  58. These can be dropped, and the calculator will be back in its original state.
  59.  
  60. The programs are entered by hand, as I don't have the hardware
  61. required to dump the program to computer electronically. There may be
  62. typos. Anything following a "%" in the listing is a comment.
  63.  
  64.  
  65. The Compiler Program:
  66.  
  67. [ Use program attached below not this one -- Wayne ]
  68. <<
  69.   " << PICT LCD-> {#0 #0}"    % enter the first part of the menu
  70.                 % program onto the stack as a string
  71.   GROB 21 7 FFFFF1FFFFF1FFFFF1FFFFF1FFFFF1FFFFF1FFFFF1
  72.   -> block            % store a 27 by 7 black block
  73.     <<
  74.       ERASE            % clear screen
  75.       0 32 FOR J        % vertical loop (step 8)
  76.         0 110 FOR I        % horizontal loop (step 22)
  77.           PICT
  78.           I R->B J R->B 2 ->LIST    % turn I, J into co-ordinates
  79.           block
  80.           REPL            % draw block at I, J
  81.           PICT            % put PICT on stack for latter use
  82.           J 8 / 1 + ->STR    % turn J (position in pixels) into a 
  83.                 % keyboard position
  84.           "," +
  85.           I 22 / 1 + ->STR +    % same for I
  86.           " Label?" +        % construct prompt string
  87.           { \alpha }
  88.           INPUT            % input label
  89.           1 ->GROB        % turn label into small lettering GROB
  90.           DUP SIZE        % extract the size of the label
  91.           #2 /            % divide height by 2
  92.           J 4 + R->B        % find the middle of the box vertically
  93.           SWAP -        % take difference to center string in box
  94.           SWAP            % swap to get the horizontal size
  95.           #2 /            % divide width by 2
  96.           I
  97.           IF 'I!=0 OR J!=32' ->NUM     % special case: enter key
  98.           THEN
  99.             11            % normal key is 21 pixels wide, half
  100.                 % this is 11.
  101.           ELSE
  102.             22 'I' STO+        % enter key. Increment I.
  103.             PICT
  104.             I R->B J R_B 2 ->LIST
  105.             block        % draw next box over
  106.             REPL
  107.             {#21 #32} {#21 #38} LINE    % fill in the pixels between
  108.                 % the boxes to make one big box.
  109.             22            % half of the big box is size 22
  110.           END
  111.           SWAP -        % take the difference to center horizontally
  112.           SWAP            % swap to get the order of co-ords right
  113.           2 ->LIST        % turn them into a coordinate list.
  114.                 % Now we have the coords to draw the
  115.                 % label centered in the box.
  116.           SWAP            % swap co-ords with the label GROB
  117.           GXOR            % draw the label (using PICT from
  118.                 % the stack at level 3.)
  119.         22 STEP            % step in the horizontal direction
  120.       8 STEP            % step in the vertical direction
  121.     >>
  122.   PICT                % extract the menu display from the
  123.   {#0 #0} {#130 #39}        % graphics screen
  124.   SUB                
  125.   ->STR +            % turn it into a string and concatenate
  126.                 % to the program segment above.
  127.   " REPL {#0 #0} SWAP REPL    % the next program segment
  128.     {#0 #0} PVIEW 0 WAIT
  129.     IF DUP 60 > THEN DROP ELSE "
  130.   +                % concatenate with the rest of the program
  131.   { }                % Start the outer-most (menu) level of
  132.                 % the commands list
  133.   1 5 FOR row
  134.     { }                % start a row-level commands list
  135.     1 6 FOR col
  136.       IF 'row==5 AND col==2' ->NUM
  137.       THEN            % special case for "enter" again
  138.         3 'col' STO
  139.       END
  140.       "(C) M Woodhams.        % a random item to be put on the stack
  141.        May be copied        % and dropped immediately inside the 
  142.        May not be sold."    % loop.
  143.       DO
  144.         DROP            % drop top of stack (junk or previous
  145.                 % incorrect keystroke)
  146.         "UNIT (Y/N)?" 3 DISP    
  147.         0 WAIT            % get keystroke
  148.       UNTIL
  149.         DUP DUP 32.1 ==
  150.         SWAP 52.1 == OR        % keep looping until "Y" or "N"
  151.       END            % leave loop with either 32.1 ("N")
  152.                 % or 52.1 ("Y") on stack.
  153.       row ->STR            % start building prompt string
  154.       "," +
  155.       col ->STR +
  156.       SWAP            % swap Y or N to top of stack
  157.       IF
  158.         32.1 ==            % if "N" then constant
  159.       THEN
  160.         " Const" +        % finish prompt string
  161.         { V } INPUT
  162.         ->OBJ 1 ->LIST        % turn the result into a one item list
  163.       ELSE            % a unit has been requested
  164.         " Unit" +        % finish prompt string
  165.         { \alpha } INPUT
  166.         -> unit            % store in unit temporarily.
  167.           <<            % build a list of three programs to
  168.                 % perform the unshifted and shifted
  169.                 % functions of a unit menu key.
  170.             " << 1_" unit + " * >>" +
  171.             OBJ->        % make unit multiply program
  172.             " << 1_" unit + " CONVERT >>" +
  173.             OBJ->        % make unit convert program
  174.             " << 1_" unit + " / >>" +
  175.             OBJ->        % make unit divide program
  176.             3 ->LIST        % turn them into a list.
  177.           >>
  178.       END
  179.       1 ->LIST +        % add the newly formed list (which
  180.                 % contains the commands for one key)
  181.                 % to the list of commands for keys
  182.                 % for the whole row. (This is a list
  183.                 % of lists.)
  184.     NEXT            % next row
  185.     1 ->LIST +            % add the newly formed row list
  186.                 % (with the commands for all the keys
  187.                 % in one row) to the master list. (This
  188.                 % is a list of lists of lists.)
  189.   NEXT    
  190.   -> STR +            % turn into a string, and concatenate
  191.                 % with the program so far.
  192.   " OVER 10 / IP GET        % the final menu program segment.
  193.     OVER 10 / FP 10 * IP GET
  194.     SWAP FP 10 * GET
  195.     EVAL END
  196.     >> "
  197.   +                % concatenate with program so far
  198.   ->OBJ                % convert from a string to a program
  199. >>                % exit with the menu program on the stack.
  200.  
  201.  
  202. Sample menu program:
  203.  
  204. <<
  205.   PICT                % PICT on stack for latter use
  206.   LCD->                % make copy of stack display
  207.   {#0 #0}
  208.                 % this is the display made by the
  209.                 % compile program. I have not typed it
  210.                 % out in full.
  211.   GROB 131 40 FFFFFDFFFF7FFFFFDFFFF7FFFFFDFFFF70
  212.               FF3FFDFF8F7FF5FFDA3737FF1FFDF7BF70
  213.               FFDFFDF7FF7FF5FFDABAA6FFDFFDF7DF70
  214.               FFDFFDF79F7FF1FFD83327FF1FFDF7EF70
  215.               etc.
  216.   REPL                % put menu display over stack display
  217.   {#0 #0}
  218.   SWAP
  219.   REPL                % put stack + menu in PICT
  220.   {#0 #0} PVIEW            % display PICT
  221.   0 WAIT            % wait for keystroke
  222.   IF                % if in row 6 or greater, quit
  223.     DUP 60 >
  224.   THEN
  225.     DROP
  226.   ELSE                % otherwise, put hierarchical list
  227.                 % onto the stack.
  228.     {                % start of main list
  229.       {                % start of first row sub-list
  230.         {'299792458_m/s'}    % first row, first key command sub-sub-list
  231.         {'6.672E-11_N*m^2/kg^2'}% etc. First row is all constants.
  232.         {'6.62618E-34_J*s'}
  233.         {'1.054589E-34_J*s'}
  234.         {'1.602189E-19_C'}
  235.         {'1.38066E-23_J/K'}
  236.       }                % end of first row sub-list
  237.       {                % start of second row sub-list
  238.         {'.000000056703_W/(m^2*K^4)'}
  239.         {'1.672649E-27_kg'}    % all constants again
  240.         {'9.010953E-31_kg'}
  241.         {'1.989E30_kg'}
  242.         {'695990000_m'}
  243.         {'3.826E26_W'}
  244.       }                % end of second row sub-list
  245.       {                % start of third row sub-list
  246.         { << '1_s' * >> << '1_s' CONVERT >> << '1_s' / >> }
  247.                 % a sub-sub-list of three programs for
  248.                 % the first key of the third row. These
  249.                 % execute the normal unit commands.
  250.         { << '1_m' * >> << '1_m' CONVERT >> << '1_m' / >> }
  251.                 % all the third and remaining rows are
  252.                 % unit keys.
  253.         { << '1_kg' * >> << '1_kg' CONVERT >> << '1_kg' / >> }
  254.         { << '1_m/s' * >> << '1_m/s' CONVERT >> << '1_m/s' / >> }
  255.         { << '1_J' * >> << '1_J' CONVERT >> << '1_J' / >> }
  256.         { << '1_K' * >> << '1_K' CONVERT >> << '1_K' / >> }
  257.       }                % end of third row sub-list
  258.       {                % start of fourth row sub-list
  259.         { << '1_yr' * >> << '1_yr' CONVERT >> << '1_yr' / >> }
  260.         { << '1_cm' * >> << '1_cm' CONVERT >> << '1_cm' / >> }
  261.         { << '1_g' * >> << '1_g' CONVERT >> << '1_g' / >> }
  262.         { << '1_cm/s' * >> << '1_cm/s' CONVERT >> << '1_cm/s' / >> }
  263.         { << '1_erg' * >> << '1_erg' CONVERT >> << '1_erg' / >> }
  264.         { << '1_W' * >> << '1_W' CONVERT >> << '1_W' / >> }
  265.       }                % end of fourth row sub-list
  266.       {                % start of fifth row sub-list
  267.                 % contains only 5 items, as fifth row
  268.                 % has only 5 keys.
  269.         { << '1_pc' * >> << '1_pc' CONVERT >> << '1_pc' / >> }
  270.         { << '1_\angstm' * >> << '1_\angstm' CONVERT >> << '1_\angstm' / >> }
  271.         { << '1_c' * >> << '1_c' CONVERT >> << '1_c' / >> }
  272.         { << '1_eV' * >> << '1_eV' CONVERT >> << '1_eV' / >> }
  273.         { << '1_b' * >> << '1_b' CONVERT >> << '1_b' / >> }
  274.       }                % end of fifth row sub-list
  275.     }                % end of main list
  276.     OVER 10 / IP GET        % get key co-ords, extract tens digit,
  277.                 % and use this to get the correct row
  278.                 % sub-list
  279.     OVER 10 / FP 10 * IP GET    % get the key co-ord, extract ones digit,
  280.                 % and use this to get the correct key
  281.                 % sub-sub-list form the row sub-list.
  282.     SWAP FP 10 * GET        % get the tenths digit, and use it
  283.                 % to extract the correct item from the
  284.                 % key sub-sub-list
  285.     EVAL            % execute/evaluate this item.
  286.   END
  287. >>
  288.  
  289. [ This is a downloadable version I recieved. -- Wayne]
  290.  
  291. I don't have a working version of the sample menu supplied, but here is the 
  292. compiler program:
  293. %%HP: T(3)A(R)F(.);
  294. \<<
  295. " \<< PICT LCD\-> {#0 #0}"
  296. GROB 21 7 FFFFF1FFFFF1FFFFF1FFFFF1FFFFF1FFFFF1FFFFF1
  297. \-> block
  298.   \<< ERASE 0 32
  299.     FOR J 0 110
  300.       FOR I PICT I
  301. R\->B J R\->B 2 \->LIST
  302. block REPL PICT J 8
  303. / 1 + \->STR "," + I
  304. 22 / 1 + \->STR +
  305. " Label?" + { \Ga }
  306. INPUT 1 \->GROB DUP
  307. SIZE # 2h / J 4 +
  308. R\->B SWAP - SWAP
  309. # 2h / I
  310.         IF 'I\=/0 OR
  311. J\=/32' \->NUM
  312.         THEN 11
  313.         ELSE 22 'I'
  314. STO+ PICT I R\->B J
  315. R\->B 2 \->LIST block
  316. REPL { # 21h # 32h
  317. } { # 21h # 38h }
  318. LINE 22
  319.         END + R\->B
  320. SWAP - SWAP 2 \->LIST
  321. SWAP GXOR 22
  322.       STEP 8
  323.     STEP
  324.   \>> PICT { # 0h
  325. # 0h } { # 130h
  326. # 39h } SUB \->STR +
  327. " REPL {#0 #0} SWAP REPL    
  328.     {#0 #0} PVIEW 0 WAIT
  329.     IF DUP 60 > THEN DROP ELSE "
  330. + { } 1 5
  331.   FOR row { } 1 6
  332.     FOR col
  333.       IF 'row==5
  334. AND col==2' \->NUM
  335.       THEN 3 'col'
  336. STO
  337.       END
  338. "(C) M Woodhams.        
  339.        May be copied        
  340.        May not be sold."
  341.       DO DROP
  342. "UNIT (Y/N)?" 3
  343. DISP 0 WAIT
  344.       UNTIL DUP DUP
  345. 32.1 == SWAP 52.1
  346. == OR
  347.       END row \->STR
  348. "," + col \->STR +
  349. SWAP
  350.       IF 32.1 ==
  351.       THEN " Const"
  352. + { V } INPUT OBJ\->
  353. 1 \->LIST
  354.       ELSE " Unit"
  355. + { \Ga } INPUT \->
  356. unit
  357.         \<< " \<< 1_"
  358. unit + " * \>>" +
  359. OBJ\-> " \<< 1_" unit +
  360. " CONVERT \>>" + OBJ\->
  361. " \<< 1_" unit +
  362. " / \>>" + OBJ\-> 3
  363. \->LIST
  364.         \>>
  365.       END 1 \->LIST +
  366.     NEXT 1 \->LIST +
  367.   NEXT \->STR +
  368. " OVER 10 / IP GET        
  369.     OVER 10 / FP 10 * IP GET
  370.     SWAP FP 10 * GET
  371.     EVAL END
  372.     \>> "
  373. + OBJ\->
  374. \>>
  375.  
  376. That ought to work.  If you're interested, here is a modified version which uses eight rows.  It has a couple of "quirks."  Rows 6, 7, and 8 are treated as the
  377. second key (i.e. number keys 7, 4, and 1) as being the third keys (as you did 
  378. with the +/- key in the labeling part of the program.  Also, in the list making
  379. subroutine, the program asks for input for keys (6,2), (7,2), and (8,2), but
  380. the final menu does nothing with the information.  Key inputs on rows 6, 7, and
  381. 8 actually begin with (6,3), (7,3), and (8,3).  Although these "quirks" can 
  382. confuse someone that doesn't know about them, they do not affect the menu 
  383. program (which seems to work just fine).  Also, if you want to use the menus to
  384. run programs, I've found that input such as { HOME poly RT} works well as a key
  385. assignment.  Oops, put an EVAL command after the { directory path}.  Anyways,
  386. here is the modified program:
  387. %%HP: T(3)A(D)F(.);
  388. DIR
  389.   COMPILE
  390.     \<< " \<< PICT "
  391. GROB 21 7 FFFFF1FFFFF1FFFFF1FFFFF1FFFFF1FFFFF1FFFFF1
  392. \-> block
  393.       \<< ERASE 0 56
  394.         FOR J 0 110
  395.           FOR I
  396.             IF 'J==
  397. 40 AND I==0' \->NUM
  398.             THEN 44
  399. 'I' STO+
  400.             END
  401.             IF 'J==
  402. 48 AND I==0' \->NUM
  403.             THEN 44
  404. 'I' STO+
  405.             END
  406.             IF 'J==
  407. 56 AND I==0' \->NUM
  408.             THEN 44
  409. 'I' STO+
  410.             END
  411. PICT I R\->B J R\->B 2
  412. \->LIST block REPL
  413. PICT J 8 / 1 + \->STR
  414. "," + I 22 / 1 +
  415. \->STR + " Label?" +
  416. { \Ga } INPUT 1 \->GROB
  417. DUP SIZE # 2h / J 4
  418. + R\->B SWAP - SWAP
  419. # 2h / I
  420.             IF 'I\=/0
  421. OR J\=/32' \->NUM
  422.             THEN 11
  423.             ELSE 22
  424. 'I' STO+ PICT I R\->B
  425. J R\->B 2 \->LIST block
  426. REPL { # 15h # 20h
  427. } { # 15h # 26h }
  428. LINE 22
  429.             END +
  430. R\->B SWAP - SWAP 2
  431. \->LIST SWAP GXOR 22
  432.           STEP 8
  433.         STEP
  434.       \>> PICT { # 0h
  435. # 0h } { # 82h
  436. # 3Fh } SUB \->STR +
  437. " {#0 #0} SWAP REPL    
  438.     {#0 #0} PVIEW 0 WAIT
  439.     IF DUP 90 > THEN DROP ELSE "
  440. + { } 1 8
  441.       FOR row { } 1
  442. 6
  443.         FOR col
  444.           IF 'row==
  445. 5 AND col==2' \->NUM
  446.           THEN 3
  447. 'col' STO
  448.           END
  449.           IF 'row==
  450. 6 AND col==1' \->NUM
  451.           THEN 2
  452. 'col' STO
  453.           END
  454.           IF 'row==
  455. 7 AND col==1' \->NUM
  456.           THEN 2
  457. 'col' STO
  458.           END
  459.           IF 'row==
  460. 8 AND col==1' \->NUM
  461.           THEN 2
  462. 'col' STO
  463.           END
  464. "(C) M Woodhams.        
  465.        May be copied        
  466.        May not be sold."
  467.           DO DROP
  468. "UNIT (Y/N)?" 3
  469. DISP 0 WAIT
  470.           UNTIL DUP
  471. DUP 32.1 == SWAP
  472. 52.1 == OR
  473.           END row
  474. \->STR "," + col \->STR
  475. + SWAP
  476.           IF 32.1
  477. ==
  478.           THEN
  479. " Const" + { V }
  480. INPUT OBJ\-> 1 \->LIST
  481.           ELSE
  482. " Unit" + { \Ga }
  483. INPUT \-> unit
  484.             \<<
  485. " \<< 1_" unit +
  486. " * \>>" + OBJ\->
  487. " \<< 1_" unit +
  488. " CONVERT \>>" + OBJ\->
  489. " \<< 1_" unit +
  490. " / \>>" + OBJ\-> 3
  491. \->LIST
  492.             \>>
  493.           END 1
  494. \->LIST +
  495.         NEXT 1
  496. \->LIST +
  497.       NEXT \->STR +
  498. " OVER 10 / IP GET        
  499.     OVER 10 / FP 10 * IP GET
  500.     SWAP FP 10 * GET
  501.     EVAL END
  502.     \>> "
  503. + OBJ\->
  504.     \>>
  505. END
  506.  
  507. P.S.  Check over the first program above and compare it to yours.  I had to
  508. make a number of typo corrections to the original PHYCONST programs on Wayne
  509. Scott's mailserver.  I even had to put in my best guess for a line of code which seemed to be missing.  I haven't found any bugs with the program, so I probably guessed right.  If the first program is correct, it should be reposted to
  510. Wayne Scott's mailserver.
  511.  
  512.                     Later,
  513.                     Brent A. Nelson
  514.                     University of Florida
  515.                     brent@Elm.CIRCA.UFL.EDU
  516.  
  517.  
  518.